#include<stdio.h>
#include<queue>
using namespace std;
const int maxn=100;
bool k[maxn][maxn]={false};
char a[maxn][maxn];
int m,n;
int s[2][4]={
  0,0,1,-1,
  1,-1,0,0,
};

struct node{
	int x,y;
	int step;
}S,T,Node;

bool test(int x,int y)
{
	if(x>=m||y>=n||x<0||y<0) 
		return false;
	if(a[x][y]=='*') 
		return false;
	if(k[x][y]==true) 
		return false;
	return true;
}

int bfs()
{
	queue<node> q;
	q.push(S);
	while(!q.empty()){
		node top=q.front();
		q.pop();
		if(top.x==T.x&&top.y==T.y)
			return top.step;
		for(int i=0;i<4;i++){
			int nx=top.x+s[0][i];
			int ny=top.y+s[1][i];
			if(test(nx,ny)){
				k[nx][ny]=true;
				Node.x=nx,Node.y=ny;
				Node.step=top.step+1;
				q.push(Node);
			}
		}
	}
	return -1;
}

int main()
{
	scanf("%d%d",&m,&n);
	for(int i=0;i<m;i++){
		getchar();
		for(int j=0;j<n;j++){
			scanf("%c",&a[i][j]);
		}
	}
	scanf("%d%d%d%d",&S.x,&S.y,&T.x,&T.y);
	printf("%d",bfs());
	return 0;
}
